package br.com.Escola.DAO;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaQuery;

import br.com.Escola.Util.JPAUtil;

public class DAO<T> {

	private final Class<T> classe;

	public DAO(Class<T> classe) {
		this.classe = classe;
	}
	
	public void salvarEntidade(T t){
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		em.persist(t);
		
		em.getTransaction().commit();
		
		em.close();
	}
	
	public void excluirEntidade(T t){
		EntityManager em = new JPAUtil().getEntityManager();
		
		em.getTransaction().begin();
		
		em.remove(t);
		
		em.getTransaction().commit();
		
		em.close();
	}

	public void atualizarEntidade(T t) {
		EntityManager em = new JPAUtil().getEntityManager();
		em.getTransaction().begin();
		
		em.merge(t);
		
		em.getTransaction().commit();
		em.close();
	}
	
	
	public List<T> listarTodos() {
		EntityManager em = new JPAUtil().getEntityManager();
		CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
		query.select(query.from(classe));
		
		List<T> lista = em.createQuery(query).getResultList();
		
		em.close();
		return lista;
	}

	public T buscarPorID(Long id) {
		return new JPAUtil().getEntityManager().find(classe, id);
	}

	@SuppressWarnings("unchecked")
	public List<T> listarTodosPaginado(int inicio, int quantidade) {
		return new JPAUtil().getEntityManager().createQuery(" FROM " + classe.getName()).setFirstResult(inicio).setMaxResults(quantidade).getResultList();
	}
}
